from werkzeug.exceptions import HTTPException
from flask import json, jsonify


class APIException(HTTPException):
    code = 500
    msg = '遇到了未知的错误'
    error_code = 1000
    data = None

    def __init__(self, msg=None, code=None, error_code=None, data=None, headers=None):
        """
        重写构造方法，新增多个属性，方便接口返回对应信息

        :param msg: 接口返回的提示性信息
        :param code: 状态码
        :param error_code: 错误码
        :param data: 接口返回的各种类型数据
        :param headers: 请求头
        """
        if code:
            self.code = code
        if error_code:
            self.error_code = error_code
        if msg:
            self.msg = msg
        if data:
            self.data = data
        super(APIException, self).__init__(msg, None)

    def get_body(self, environ=None, scope=None):
        """
        自定义请求体返回数据

        :param environ: 不用管这玩意，我也不知道是啥，源码里面这么写我重写就照着抄了
        :param scope: 同上，不写这玩意这方法跑不起来，我也没办法，见谅
        :return: 修改后的请求体，包含三个字段的数据
        """
        body = dict(
            msg=self.msg,
            data=self.data,
            error_code=self.error_code
        )
        return json.dumps(body)

    def get_headers(self, environ=None, scope=None):
        """
        自定义请求头，返回json类型数据

        :param environ: 别问，和上个方法一样，不知道干啥的，源码看不懂，我太菜了
        :param scope: 同上
        :return:
        """
        return [('Content-Type', 'application/json')]
